#include <bits/stdc++.h>
using namespace std;
#include <atcoder/lazysegtree>
#include <atcoder/modint>
using namespace atcoder;
using ll = long long;
using pii = pair<int, int>;
#define rep(i, a, b) for (int i = (a); i <= (b); i++)
#define per(i, a, b) for (int i = (a); i >= (b); i--)
#define endl '\n'
const int N = 2e5 + 5;

using mint = modint998244353;
struct S {
  mint a;
  int size;
};
struct F {
  mint a, b;
};
S op(S l, S r) { return S{l.a + r.a, l.size + r.size}; }
S e() { return S{0, 0}; }
S mapping(F l, S r) { return S{r.a * l.a + r.size * l.b, r.size}; }
F composition(F l, F r) { return F{r.a * l.a, r.b * l.a + l.b}; }
F id() { return F{1, 0}; }

int main() {
  ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  int n, m;
  cin >> n >> m;
  vector<S> a(n);
  rep(i, 0, n - 1) {
    int x;
    cin >> x;
    a[i] = S{x, 1};
  }
  lazy_segtree<S, op, e, F, mapping, composition, id> seg(a);
  while (m--) {
    int t, l, r, c, d;
    cin >> t;
    if (!t) {
      cin >> l >> r >> c >> d;
      seg.apply(l, r, F{c, d});
    } else {
      cin >> l >> r;
      cout << seg.prod(l, r).a.val() << endl;
    }
  }
  return 0;
}